// 引入模块
var express = require('express')
var bodyParser = require('body-parser')
var fs = require('fs')
var ejs = require('ejs')
var multipart = require('connect-multiparty');
var cors = require("cors")
var { expressjwt } = require("express-jwt");
const { pool, initRedis } = require('./db/database');

// 路由模块化
var users = require("./router/users")
var repaire = require("./router/repaire")
var examine = require("./router/examine")
var inventory = require("./router/inventory")
var personnel = require("./router/personnel")
var my = require("./router/my")
var department = require("./router/department")
var permission = require("./router/permission")

// 创建服务器
var app = express();
app.use(cors())

// 创建multipart中间件实例
var multipartMiddleware = multipart();
// 设置上传目录
app.use(multipart({ uploadDir: './public/uploads' }));

//  通过如下代码就可以将 public 目录下的图片、CSS 文件、JavaScript 文件对外开放访问了：
app.use(express.static('public'))

// 下面这段代码是使用Express框架中的body-parser中间件来解析HTTP请求体中的URL编码数据。
// 当extended参数设置为false时，它只支持扩展的URL编码格式（即不包含嵌套对象）。
app.use(bodyParser.urlencoded({
    extended: false
}));
// parse application/json
app.use(bodyParser.json())

// token设置
app
    .use(expressjwt({
        algorithms: ["HS256"],
        credentialsRequired: false ,  // 允许不带 Token 的请求
        secret: "pwdxpxweixiu",//加密密钥，可换,'
    })
        .unless({
            // path: ["/user"]//添加不需要token验证的路由 
            path: [
                { url: /^\/(user|auth)\/.*/, methods: ["GET", "POST"] }, // 匹配 /user 和 /auth 所有子路由
                { url: /\/public\// }            // 包含 /public/ 的路由
              ]
            // 其它的页面，在请求的时候，都需要携带token.在请求的头中添加Authorization字段发送token
            // 子路由不会继承，需要单独处理
            // path:[
            //     "/login",
            //     "/register",
            //     '/baoxiu/upload', // 确保这里是不需要验证的路由
            //     // 如果有子路由，确保它们也被正确排除
            //     { url: /^\/baoxiu\/.*/, methods: ['GET', 'POST', 'PUT', 'DELETE'] } // 例如，排除 /baoxiu 下的所有子路由
            // ]
        }));

// token 解析出错时候处理（不能判断是否携带toknen）
app.use((err, req, res, next) => {
    console.error("Error middleware:", err);  // 更详细的错误日志

    // 标准化错误响应格式
    const errorResponse = {
        success: false,
        status: err.status || 500,
        message: err.message || "Internal Server Error",
        stack: process.env.NODE_ENV === 'development' ? err.stack : undefined
    };

    // JWT 认证错误
    if (err.name === "UnauthorizedError" || err.name === "JsonWebTokenError") {
        errorResponse.status = 401;
        errorResponse.message = "无效的token或token已过期";
        return res.status(401).json(errorResponse);
    }

    // Token 缺失的情况
    if (err.name === "TokenMissingError") {  // 你需要自己定义这个错误
        errorResponse.status = 401;
        errorResponse.message = "请提供认证token";
        return res.status(401).json(errorResponse);
    }

    // 其他错误
    res.status(errorResponse.status).json(errorResponse);
});

app.use('/user', users)
app.use('/baoxiu', repaire)
app.use('/shenhe', examine)
app.use('/kucun', inventory)
app.use('/renyuan', personnel)
app.use('/my', my)
app.use('/department', department)
app.use("/permission", permission)
// app.use('/api', exampleRoutes);

// 启动服务器
app.listen(3000, async () => {
    try {
        await initRedis(); // 初始化Redis连接、方便项目使用
        console.log('Redis connected successfully');
        console.log('服务器监听地址:http://127.0.0.1:3000');
    } catch (error) {
        console.error('Failed to connect to Redis:', error);
        process.exit(1);
    }
});